/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package EntidadesController;

import Criptografia.BlowFish;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;
import javax.swing.JOptionPane;

/**
 *
 * @author fernando
 */
public class Discente {
//    CREATE TABLE discente (
//    matriculadisc VARCHAR(9),
//    usuario_usrlogin VARCHAR(20),
//    nome varchar(40),
//    curso_codigocurso VARCHAR(45),
//    ddd VARCHAR(2),
//    num VARCHAR(8),
//    tec_Cel_tecnologia VARCHAR(10),
//    email varchar(30),
//    CONSTRAINT pk_matriculadisc PRIMARY KEY (matriculadisc)
//    );

    private String matriculadisc = "";
    private String usuario_usrlogin = "";
    private String curso_codigocurso = "";
    private String nome_curso = "";
    private String ddd = "";
    private String num = "";
    private String nome = "";
    private String email = "";
    private String senha = "";
    private String grupo = "Discente";
    private String tec_Cel_tecnologia = "";
    private String num_faltas = "";
    private String turma = "";
    private String matriculadoc = "";
    private String tiponotificacao = "";
    private String texto = "";
    private List<String> lista;
    private List<String> faltas;
    private List<Avaliacao> notas;
    private List<Historico_n> listaHistorico;
    private List<Preferencia> listaPreferencia;
    private SQLException erro = new SQLException();
    private SQLException erro2 = new SQLException();
    private String msgerro;
    private String msgerro2;
    private String msgacerto;
    private boolean render=false;
    private boolean render2=false;
    private boolean render3=false;
    private boolean render4=false;

    static Connection conexao = null;
    static Statement estado = null;
    static ResultSet rs;
    static ResultSet rs2;
    static ResultSet rs3;
    String cript;
    private String concat;

    public String getMsgacerto() {
        return msgacerto;
    }

    public void setMsgacerto(String msgacerto) {
        this.msgacerto = msgacerto;
    }



    public boolean isRender4() {
        return render4;
    }

    public void setRender4(boolean render4) {
        this.render4 = render4;
    }



    public Discente() {
        conexao = new Conexao().Acesso();
    }

    public String inserir() throws SQLException {
        String result_inserir = "failure";

        try {

            estado = conexao.createStatement();

            this.setCodCurso();

            estado.execute("BEGIN WORK");

            estado.execute("INSERT INTO Usuario(usrlogin,senha,grupo_grupo) VALUES ('" + usuario_usrlogin + "','"
                    + senha + "','" + grupo + "')");

            estado.execute("INSERT INTO discente(matriculadisc,usuario_usrlogin,nome,curso_codigocurso,ddd,num,"
                    + "tec_Cel_tecnologia,email) VALUES ('" + matriculadisc + "','" + usuario_usrlogin + "','" + nome
                    + "','" + curso_codigocurso + "','" + ddd + "','" + num + "','" + tec_Cel_tecnologia + "','" + email + "')");

            estado.execute("COMMIT");
            estado.close();
            result_inserir = "success";
            render = false;
            msgacerto = "Cadastro realizado com sucesso!";
            render4 = true;
        } catch (SQLException e) {
            this.erro = e;
            msgerro = erro.getLocalizedMessage();

            if (msgerro.contains("pk_matriculadisc")&&msgerro.contains("unicidade"))
            {msgerro = "Esse número de matrícula ja está cadastrado!";}

            if (msgerro.contains("un_celular")&&msgerro.contains("unicidade"))
            {msgerro = "Esse número de telefone ja está cadastrado!";}

            if (msgerro.contains("pk_id")&&msgerro.contains("unicidade"))
            {msgerro = "Esse login ja está cadastrado!";}

            estado.execute("ROLLBACK");
            estado.close();
            result_inserir = "failure";
            render = true;
            render4 = false;
        }
        return result_inserir;
    }

    public String buscarPorMatricula() throws SQLException{
        String result = "failure";
        try{
          //  System.out.println("Matricula ---> " + matriculadisc);
            estado = conexao.createStatement();
            rs = estado.executeQuery("SELECT * FROM discente WHERE matriculadisc = '" + matriculadisc + "'");
            //rs = estado.executeQuery("SELECT * FROM discente WHERE matriculadisc = 071111830");

            if(rs.next()){
                matriculadisc = rs.getString(1);
                usuario_usrlogin = rs.getString(2);
                nome = rs.getString(3);
                curso_codigocurso = rs.getString(4);
                ddd = rs.getString(5);
                num = rs.getString(6);
                tec_Cel_tecnologia = rs.getString(7);
                email = rs.getString(8);
                //senha = rs.getString(10);
            }
            this.listaPreferencia = this.geraListaPreferencias();
            int i;

            rs.close();
            estado.close();
            result = "success";
        }
        catch(SQLException e){
            this.erro = e;
            msgerro2 = erro.getLocalizedMessage();

            if (msgerro2.contains("pk_matriculadisc")&&msgerro.contains("unicidade"))
            {msgerro2 = "Esse número de matrícula ja está cadastrado!";}
            result = "failure";
        }
        //concat = "Nome = " +nome+"\n" + "Matricula = " +matriculadisc+ "\n"
          //      +"Nome de Usuário = "+usuario_usrlogin+"\n" + "Curso = "+curso_codigocurso+"\n"
            //    +"Telefone = ("+ddd+") " +num+"\n" + "Tecnologia do celular = "+tec_Cel_tecnologia+"\n";
        //JOptionPane.showMessageDialog(null, usuario_usrlogin);
        System.out.println("RESULTADO ---->" + result);
        System.out.println("RESULTADO ---->" + nome);
        System.out.println("RESULTADO ---->" + num);
        System.out.println("RESULTADO ---->" + curso_codigocurso);
        System.out.println("RESULTADO ---->" + tec_Cel_tecnologia);
        //this.telaImpressao();
        //System.out.println("RESULTADO ---->" + senha);
        return result;
    }

    public void telaImpressao(){
        JOptionPane.showMessageDialog(null, concat);
    }

    public String editar() throws SQLException {
        String result_editar = "failure";
        try {
            estado = conexao.createStatement();
            estado.execute("BEGIN WORK");

            estado.execute("update discente set email = '" + email + "' where matriculadisc ='" + matriculadisc + "'");
            estado.execute("update discente set ddd = '" + ddd + "' where matriculadisc ='" + matriculadisc + "'");
            estado.execute("update discente set num = '" + num + "' where matriculadisc ='" + matriculadisc + "'");
            estado.execute("update discente set tec_Cel_tecnologia = '" + tec_Cel_tecnologia + "' where matriculadisc ='" + matriculadisc + "'");
         
            estado.execute("COMMIT");

            estado.close();

            if(this.listaPreferencia==null)
            {
                this.listaPreferencia = this.geraListaPreferencias();
            }


            Preferencia temp = new Preferencia();
            temp.setMatriculaDisc(matriculadisc);
            temp.atualizarPreferencia(this.listaPreferencia);

            result_editar = "success";

            email = "";
            curso_codigocurso = "";
            ddd = "";
            num = "";
            nome = "";
            tec_Cel_tecnologia = "";
            matriculadisc = "";
            usuario_usrlogin = "";
        } catch (SQLException e) {
            this.erro2 = e;
            msgerro2 = erro2.getLocalizedMessage();

            if (msgerro2.contains("pk_matriculadisc")&&msgerro2.contains("unicidade"))
            {msgerro2 = "Esse número de matrícula ja está cadastrado!";}

            if (msgerro2.contains("un_celular")&&msgerro2.contains("unicidade"))
            {msgerro2 = "Esse número de telefone ja está cadastrado!";}

            if (msgerro2.contains("pk_id")&&msgerro2.contains("unicidade"))
            {msgerro2 = "Esse login ja está cadastrado!";}
            estado.execute("ROLLBACK");
            estado.close();
            result_editar = "failure";
            render3 = true;
        }
        return result_editar;
    }

    public String getMsgerro2() {
        return msgerro2;
    }

    public void setMsgerro2(String msgerro2) {
        this.msgerro2 = msgerro2;
    }

    public boolean isRender3() {
        return render3;
    }

    public void setRender3(boolean render3) {
        this.render3 = render3;
    }


    public boolean isRender2() {
        return render2;
    }

    public void setRender2(boolean render2) {
        this.render2 = render2;
    }


    public boolean isRender() {
        return render;
    }

    public void setRender(boolean render) {
        this.render = render;
    }

    public String buscar() throws SQLException {
        String result_busca = "failure";

        try {
            estado = conexao.createStatement();
            rs = estado.executeQuery("SELECT * FROM discente JOIN usuario on usrlogin = '" + usuario_usrlogin + "'"
                    + " and usuario_usrlogin = '" + usuario_usrlogin + "'");
            if (rs.next()) {
                matriculadisc = rs.getString(1);
                usuario_usrlogin = rs.getString(2);
                nome = rs.getString(3);
                curso_codigocurso = rs.getString(4);
                ddd = rs.getString(5);
                num = rs.getString(6);
                tec_Cel_tecnologia = rs.getString(7);
                email = rs.getString(8);
                senha = rs.getString(10);
            }
            rs.close();
            estado.close();
            result_busca = "success";
        } catch (SQLException e) {
            this.erro = e;
            estado.execute("ROLLBACK");
            estado.close();
            result_busca = "failure";
        }
        return result_busca;
    }

    //Metodo criado por João Gabriel
    //Faz busca baseado no número de matricula do estudante.
    public String buscarPorMatricula(int matricula) throws SQLException{
        String result = "failure";

        try{
            estado = conexao.createStatement();
            rs = estado.executeQuery("SELECT * FROM discente WHERE matriculadisc = " + matricula + " ");

            if(rs.next()){
                matriculadisc = rs.getString(1);
                usuario_usrlogin = rs.getString(2);
                nome = rs.getString(3);
                curso_codigocurso = rs.getString(4);
                ddd = rs.getString(5);
                num = rs.getString(6);
                tec_Cel_tecnologia = rs.getString(7);
                email = rs.getString(8);
                senha = rs.getString(10);
            }
            rs.close();
            estado.close();
            this.listaPreferencia = this.geraListaPreferencias();
            result = "sucess";
        }
        catch(SQLException e){
            this.erro = e;
            estado.execute("ROLLBACK");
            estado.close();
            result = "failure";
        }
        return result;
    }

    public String getDdd() {
        return ddd;
    }

    public void setDdd(String ddd) {
        this.ddd = ddd;
    }

    public String getGrupo() {
        return grupo;
    }

    public String getMsgerro() {
        return msgerro;
    }

    public void setMsgerro(String msgerro) {
        this.msgerro = msgerro;
    }


    public String getErro() {

        return erro.getMessage();
    }

    public String getNum() {
        return num;
    }

    public void setNum(String num) {
        this.num = num;
    }

    public String getSenha() {
        return senha;
    }

    public List<String> getFaltas() {
        return faltas;
    }

    public void setFaltas(List<String> listaFaltas) {
        this.faltas = listaFaltas;
    }

    public List<Historico_n> getListaHistorico() {
        return listaHistorico;
    }

    public void setListaHistorico(List<Historico_n> listaHistorico) {
        this.listaHistorico = listaHistorico;
    }

    public String getTiponotificacao() {
        return tiponotificacao;
    }

    public void setTiponotificacao(String tiponotificacao) {
        this.tiponotificacao = tiponotificacao;
    }

    public void setSenha(String senha) {
        senha = senha.toLowerCase();
        cript = BlowFish.cript(senha, usuario_usrlogin);
        this.senha = cript;
    }

    public String getUsuario_usrlogin() {
        return usuario_usrlogin;
    }

    public void setUsuario_usrlogin(String usuario_usrlogin) {
        this.usuario_usrlogin = usuario_usrlogin;
    }

    public String getCurso_codigocurso() {
        return curso_codigocurso;
    }

    public String getTurma() {
        return turma;
    }

    public void setTurma(String turma) {
        this.turma = turma;
    }

    public List<String> getNomeCurso() throws SQLException {

        List<String> items = new ArrayList<String>();

        estado = conexao.createStatement();
        rs = estado.executeQuery("SELECT * FROM curso");
        while (rs.next() == true) {
            items.add(rs.getString(3));
        }
        return items;
    }

    public void setCurso_codigocurso(String curso_codigocurso) {
        this.curso_codigocurso = curso_codigocurso;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getMatriculadisc() {
        return matriculadisc;
    }

    public void setMatriculadisc(String matriculadisc) {
        this.matriculadisc = matriculadisc;
    }

    public String getNome() {
        return nome;
    }

    public void setNotas(List<Avaliacao> notas) {
        this.notas = notas;
    }

    public void setNome(String nome) {
        if(nome.length()<51)
        {this.nome = nome;}
        else
        {render = true;
        msgerro = "O nome deve ter até 50 caracteres!";}
    }

    public String getTec_Cel_tecnologia() {
        return tec_Cel_tecnologia;
    }

    public void setTec_Cel_tecnologia(String tec_Cel_tecnologia) {
        this.tec_Cel_tecnologia = tec_Cel_tecnologia;
    }

    public String getNome_curso() {
        return nome_curso;
    }

    public void setNome_curso(String nome_curso) {
        this.nome_curso = nome_curso;
    }

    public String getNum_faltas() {
        return num_faltas;
    }

    public void setNum_faltas(String num_faltas) {
        this.num_faltas = num_faltas;
    }
    public void setListaPreferencia(List<Preferencia> listaPreferencia)
    {
        this.listaPreferencia = listaPreferencia;
    }

    public List<Preferencia> getListaPreferencia()
    {
        return this.listaPreferencia;
    }
   
    /*
     * Este metodo retorna uma lista de strings, necessaria para exibir
     * a combobox na interface com o usuario e nao tda a tabela.
     */
    public List<String> getMatriculaDiscente() throws SQLException {

        List<String> itens = new ArrayList<String>();

        try {
            estado = conexao.createStatement();

            rs = estado.executeQuery("SELECT * FROM Discente");

            while (rs.next() == true) {

                // primeira coluna da latela: matriculadisc;
                itens.add(rs.getString(1));
            }
            return itens;

        } catch (SQLException ex) {
            this.erro = ex;
            estado.execute("ROLLBACK");
            estado.close();
            System.out.println("A tabela esta vazia.");
            Logger.getLogger(Curso.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }

    // Retorna uma lista todas as notas de uma determinada disciplina do objeto discente;
    public List<Avaliacao> getNotas() {
        return notas;
    }

    /* Retorna o id de uma disciplina especifica de um determinado estudante */
    public String getIdDisciplina(String turma, String matricula) throws SQLException {

        String indice = "";

        estado = conexao.createStatement();
        rs = estado.executeQuery("SELECT * FROM turma_has_discente WHERE "
                + "discente_matriculadisc = '" + matricula + "' and turma_disciplina_coddisciplina = '" + turma + "'");

        while (rs.next() == true) {
            indice = rs.getString(1);
        }
        return indice;
    }

    public List<Avaliacao> geraListaNotas(String turma) throws SQLException {

        Discente discente;
        List<Avaliacao> avaliacao = new ArrayList<Avaliacao>();
        List<String> listaNotas = new ArrayList<String>();
        List<String> listaUnidades = new ArrayList<String>();


        try {

            discente = (Discente) FacesContext.getCurrentInstance().getExternalContext()
                            .getSessionMap().get("discente");
            discente.buscar();
   

            estado = conexao.createStatement();
            rs2 = estado.executeQuery("SELECT idturma_has_discente FROM turma_has_discente "
                                    + "WHERE discente_matriculadisc = '" + discente.matriculadisc + "' "
                                    + "AND turma_disciplina_coddisciplina = '" + turma + "'");

          String id = "";
          while (rs2.next() == true) {
                id = rs2.getString(1);
            }

            rs = estado.executeQuery("SELECT TO_CHAR(nota, '99.9'), unidade FROM Avaliacao " +
                    "WHERE idturma_x_discente = '" + id + "' ORDER BY unidade ASC");

            while (rs.next() == true) {
                Avaliacao a = new Avaliacao();              
                a.setNota(rs.getString(1));
                a.setUnidade(rs.getString(2));
                avaliacao.add(a);
            }
            return avaliacao;

        } catch (SQLException ex) {
            this.erro = ex;
            estado.execute("ROLLBACK");
            estado.close();
            System.out.println("A tabela esta vazia.");
            Logger.getLogger(Curso.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }

    // Retorna uma lista todas as faltas numa determinada disciplina do objeto discente que chamar este metodo;
    public List<String> geraListaFaltas(String turma) throws SQLException {

        int n_faltas = 0;
        num_faltas = "0";
        Discente discente;
        List<String> itens = new ArrayList<String>();

        try {

           discente = (Discente) FacesContext.getCurrentInstance().getExternalContext()
                            .getSessionMap().get("discente");
           discente.buscar();

           String indice = this.getIdDisciplina(turma, discente.matriculadisc);

            estado = conexao.createStatement();
            rs = estado.executeQuery("SELECT * FROM Falta WHERE idturma_x_discente = '"+ indice +"'");

            while (rs.next() == true) {

                String dia = rs.getString(2);
                String mes = rs.getString(3);
                String ano = rs.getString(4);

                String falta = dia + " de " + mes + " de " + ano;
                n_faltas++;
                itens.add(falta);
            }
            this.setNum_faltas(n_faltas + "");
            return itens;

        } catch (SQLException ex) {
            this.erro = ex;
            estado.execute("ROLLBACK");
            estado.close();
            System.out.println("A tabela esta vazia.");
            Logger.getLogger(Curso.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }

    public void setCodCurso() throws SQLException {

        estado = conexao.createStatement();

        rs = estado.executeQuery("SELECT codigocurso FROM Curso WHERE descricao = '" + this.nome_curso + "'");

        while (rs.next() == true) {

            // Seta o codigo do curso de acordo com a sua descricao;
            this.curso_codigocurso = rs.getString(1);
        }
    }

    /*
     * Este metodo retorna uma lista de strings, necessaria para exibir
     * a combobox na interface com o usuario e nao tda a tabela.
     */
    public List<String> getListaTurmas() throws SQLException {

        Discente discente;
        List<String> itens = new ArrayList<String>();

        try {

            discente = (Discente) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("discente");
            discente.buscar();

            estado = conexao.createStatement();

            rs = estado.executeQuery("SELECT turma_disciplina_coddisciplina FROM Turma_has_discente "
                    + "WHERE discente_matriculadisc = '" + discente.matriculadisc + "'");

            while (rs.next() == true) {

                // primeira coluna da latela: matriculadisc;
                itens.add(rs.getString(1));
            }
            return itens;

        } catch (SQLException ex) {
            estado.execute("ROLLBACK");
            estado.close();
            System.out.println("A tabela esta vazia.");
            Logger.getLogger(Curso.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }

    public String geraNotasTurma(ValueChangeEvent event) {

        if (event.getNewValue() != event.getOldValue()) {
            this.notas = new ArrayList<Avaliacao>();
        }

        try {
            this.notas = geraListaNotas(event.getNewValue().toString());
            return "success";
        } catch (Exception e) {
            return "failure";
        }
    }


    public String geraFaltasTurma(ValueChangeEvent event) {

        num_faltas = "";
        if (event.getNewValue() != event.getOldValue()) {
            this.faltas = new ArrayList<String>();
        }

        try {
            this.faltas = this.geraListaFaltas(event.getNewValue().toString());
            return "success";
        } catch (Exception e) {
            return "failure";
        }
    }

    public String geraHistoricoTipo() {

        Historico_n historico;
        Discente discente;
        this.listaHistorico = new ArrayList<Historico_n>();
        try {
            discente = (Discente) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("discente");
            discente.buscar();
            this.matriculadisc = discente.getMatriculadisc();

            System.out.println("Tipo: " + this.matriculadisc);

            estado = conexao.createStatement();
            rs = estado.executeQuery("SELECT * FROM NOTIFICACAO WHERE DISCENTE_MATRICULADISC = '"+this.matriculadisc+"' ORDER BY TIPO_NOTIF_TIPONOTIFICACAO ASC");
            int i = 0;
            while (rs.next()) {
                historico = new Historico_n();
                historico.setDocente_matriculadoc(rs.getString(4));
                historico.setTexto(rs.getString(5));
                historico.setTipo_notif_tiponotificacao(rs.getString(3));
                historico.buscaNomeDocente();
                listaHistorico.add(historico);
                i++;
            }
            rs.close();
            estado.close();
            return "success";

        } catch (Exception e) {
            return "failure";
        }
    }

    /** Esse método gera uma lista do tipo Preferencia, setando as selecionadas pelo discente;

     * @author Ciro Marques

     * @return List<Preferencia> - Lista de todos os tipos de mensagem, setando apenas as que fazem parte do perfil do aluno

     */
    public List<Preferencia> geraListaPreferencias() throws SQLException
    {
        List<Preferencia> temp = new ArrayList<Preferencia>();
        Preferencia prefer;
        List<String> preferList = new ArrayList<String>();
        preferList = this.geraPreferencias();
        estado = conexao.createStatement();
        try
        {
            rs = estado.executeQuery("SELECT tiponotificacao FROM tipo_notif");
            if(!this.matriculadisc.equalsIgnoreCase(""))
            while (rs.next() == true)
            {
                prefer = new Preferencia();
                prefer.setMatriculaDisc(matriculadisc);
                prefer.setDescricao(rs.getString(1));
                temp.add(prefer);
            }
            int i,j;                            //Trecho que seta as preferencias já selecionadas
            for(i=0;i<preferList.size();i++)
            {
                for(j=0;j<temp.size();j++)
                {
                    if(temp.get(j).getDescricao().compareTo(preferList.get(i))==0)
                    {
                        temp.get(j).setHasSelected(true);
                        j=temp.size();
                    }
                }
            }
            estado.close();
        }
        catch (SQLException e)
        {
            this.erro = e;
            estado.close();
        }
        return temp;
    }
    /** Este método gera uma lista das preferências já escolhidas pelo discente corrente a partir do BD;

     * @author Ciro Marques

     * @return List<String> - Lista de Strings referentes as preferências de mensagens já escolhidas;

     */
    public List<String> geraPreferencias() throws SQLException
    {
        List<String> preferList = new ArrayList<String>();
        Preferencia temp = new Preferencia();
        estado = conexao.createStatement();
        try
        {
            rs = estado.executeQuery("SELECT tipo_notif_tiponotificacao FROM " +
                    "preferencia WHERE discente_matriculadisc = '"+this.matriculadisc+"';");
            int i = 0;
            while (rs.next() == true)
            {
                preferList.add(rs.getString(1));
            }
            estado.close();
        }
        catch (SQLException e)
        {
            this.erro = e;
            estado.close();
        }
        return preferList;
    }
    public String carregaDados(){

        Discente discente;

        try {
            discente = (Discente) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("discente");
            discente.buscar();
            this.setNome(discente.getNome());
            this.setMatriculadisc(discente.getMatriculadisc());
            this.setCurso_codigocurso(discente.getCurso_codigocurso());
            this.setNum(discente.getNum());
            this.setDdd(discente.getDdd());
            this.setTec_Cel_tecnologia(discente.getTec_Cel_tecnologia());
            this.setEmail(discente.getEmail());
            return "success";
        } catch (SQLException ex) {
            Logger.getLogger(Discente.class.getName()).log(Level.SEVERE, null, ex);
            return "failure";
        }
    }

    public String getCurso() {

        Discente discente;

    try {
        discente = (Discente) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("discente");
        discente.buscar();

        estado = conexao.createStatement();
        rs = estado.executeQuery("SELECT descricao FROM curso WHERE codigocurso = '" + this.curso_codigocurso + "'");
      if(rs.next())
        nome_curso = rs.getString(1);
        return nome_curso;
        }
         catch (SQLException ex) {
            Logger.getLogger(Discente.class.getName()).log(Level.SEVERE, null, ex);
            return "failure";
            }
    }
}
